<?php
/**
 * Classe que usa o padrão Data Access Object para criar, ler, atualizar e deletar no banco de dados objetos do tipo Palestrante
 * @name PalestranteDAO
 * @author Fabio Cezar Baía baiacfabio@gmail.com
 * @since 25/04/2013 17:09:57
 */
class PalestranteDAO extends DAO{
		
		
	/**
	 * Persiste um novo Palestrante no banco de dados ou atualiza caso ja exista
	 * @access public
     * @name save
	 * @param Palestrante $palestrante
	 * @since 25/04/2013 17:10:03
	 */
	public function save( Palestrante $palestrante ) {		
		
		if($palestrante->getId() == ""){			
			$this->insert($palestrante);		
		}else{
			$this->update($palestrante);		
		}				
	}
	
	/**
	* Insere um novo Palestrante no banco de dados
	* @access private
	* @name insert
	* @param Palestrante $palestrante
	* @since 25/04/2013 17:10:14
	*/
	private function insert(Palestrante $palestrante) {
		try{				
			$stmt = $this->db->prepare("INSERT INTO `{$this->entity}` (nome, email, telefone, curriculum, linkLattes, foto, dataModificacao) VALUES (?, ?, ?, ?, ?, ?, ?)");
			$stmt->bindValue(1, $palestrante->getNome() );
			$stmt->bindValue(2, $palestrante->getEmail() );
			$stmt->bindValue(3, $palestrante->getTelefone() );
			$stmt->bindValue(4, $palestrante->getCurriculum() );
			$stmt->bindValue(5, $palestrante->getLinkLattes() );
			$stmt->bindValue(6, $palestrante->getFoto() );
			$stmt->bindValue(7, $palestrante->getDataModificacao()->format('Y-m-d H:i:s') );
			$stmt->execute();
			
			//verifica se é pra associar a algum evento, inserindo uma entrada no entidade do relacionamento
			$lastId = $this->db->lastInsertId();
			//echo "lastId ".$lastId;
			
			//pega todos os eventos do participante
			$eventos = $palestrante->getEventos();
			$ultimoEvento = $eventos[sizeof($eventos)-1];
			$idEvento = $ultimoEvento->getId();
			
			//criar metodo insertDataInEntityRelated($entityRelated)
			$mappings = $palestrante->getMapping();
			$entityRelated = "evento";
			
			foreach($mappings as $mapping){
				if($mapping["entityRelated"] == $entityRelated){
					if($mapping["type"] == "ManyToMany"){
						if($mapping["owner"] == "true"){
							$atrib_1 = substr($this->entity, strlen($this->tablePrefix))."_id";
							$atrib_2 = $mapping["entityRelated"]."_id";
							
							$stmt = $this->db->prepare("INSERT INTO `".$this->tablePrefix."".$this->entity."_".$mapping["entityRelated"]."` (".$atrib_1.", ".$atrib_2.") VALUES (?, ?)");
							$stmt->bindValue(1, $lastId );
							$stmt->bindValue(2, $idEvento);	
							
							//echo "OWNER";
							//echo "INSERT INTO `".$this->entity."_".$mapping["entityRelated"]."` (".$atrib_1.", ".$atrib_2.") VALUES (?, ?)";
						
						}else{
							$atrib_1 = $mapping["entityRelated"]."_id";
							$atrib_2 = substr($this->entity, strlen($this->tablePrefix))."_id";
							
							$stmt = $this->db->prepare("INSERT INTO `".$this->tablePrefix."".$mapping["entityRelated"]."_".substr($this->entity, strlen($this->tablePrefix))."` (".$atrib_1.", ".$atrib_2.") VALUES (?, ?)");
							$stmt->bindValue(1, $idEvento);
							$stmt->bindValue(2, $lastId );
							
							//echo "INSERT INTO `".$this->tablePrefix."".$mapping["entityRelated"]."_".substr($this->entity, strlen($this->tablePrefix))."` (".$atrib_1.", ".$atrib_2.") VALUES (?, ?)";
						}
						
						
						$stmt->execute();
						//echo "<br />executou";
					}					
				}
			}
			//fim verifica se tem associacao
			
					
			//SystemMessage::createMessage("Palestrante cadastrado com sucesso!.", SystemMessage::TYPE_SUCCESS);
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			//SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
	}
	
	/**
	* Atualiza um Palestrante no banco de dados
	* @access private
	* @name update
	* @param Palestrante $palestrante
	* @since 25/04/2013 18:52:25
	*/
	private function update(Palestrante $palestrante) {

		try{
			$stmt = $this->db->prepare("UPDATE `{$this->entity}` set nome = ?, email = ?, telefone = ?, curriculum = ?, linkLattes = ?, foto = ?, dataModificacao = ? WHERE id = ?");
			$stmt->bindValue(1, $palestrante->getNome() );
			$stmt->bindValue(2, $palestrante->getEmail() );
			$stmt->bindValue(3, $palestrante->getTelefone() );
			$stmt->bindValue(4, $palestrante->getCurriculum() );
			$stmt->bindValue(5, $palestrante->getLinkLattes() );
			$stmt->bindValue(6, $palestrante->getFoto() );
			$stmt->bindValue(7, $palestrante->getDataModificacao()->format("Y-m-d H:i:s") );
			$stmt->bindValue(8, $palestrante->getId() );
			$stmt->execute();
				
							
			SystemMessage::createMessage("Palestrante atualizado com sucesso!", SystemMessage::TYPE_SUCCESS);
			
			// fecho a conexão
			$this->db = null;			
			
			
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
		
				
		
		
		
		
	}
	
	/**
	* Obtem um Palestrante do banco com base no id
	* @access public
	* @name get
	* @param int $id Id do Palestrante a ser obtido
	* @since 25/04/2013 18:54:44
	* @return Palestrante
	*/
	public function get($id) {
		$palestrante = new Palestrante();
		
		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}` WHERE id = ?");
			$stmt->bindValue(1, $id, PDO::PARAM_INT);
			$stmt->execute();
			
			$obj = $stmt->fetchObject();
			$palestrante->setId($obj->id);
			$palestrante->setNome($obj->nome);
			$palestrante->setEmail($obj->email);
			$palestrante->setTelefone($obj->telefone);
			$palestrante->setCurriculum($obj->curriculum);
			$palestrante->setLinkLattes($obj->linkLattes);
			$palestrante->setFoto($obj->foto);
			$palestrante->setDataModificacao($obj->dataModificacao);
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}		
		
		return $palestrante;
	}
	
	/**
	* Lista todos os Palestrantes do banco
	* @access public
	* @name listAll
	* @since 25/04/2013 18:59:32
	* @return array Array de Palestrantes
	*/
	public function listAll() {
		$lista = array();
		
		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}`");
			$stmt->execute();
			
			while ($obj = $stmt->fetch(PDO::FETCH_OBJ, PDO::FETCH_ORI_NEXT)) {
				
				$palestrante = new Palestrante();
				$palestrante->setId($obj->id);
				$palestrante->setNome($obj->nome);
				$palestrante->setEmail($obj->email);
				$palestrante->setTelefone($obj->telefone);
				$palestrante->setCurriculum($obj->curriculum);
				$palestrante->setLinkLattes($obj->linkLattes);
				$palestrante->setFoto($obj->foto);
				$palestrante->setEventoId($obj->eventoId);
				$palestrante->setDataModificacao($obj->dataModificacao);
				
				$lista[] = $palestrante;
			}			
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}
		
		return $lista;
	}
	
	/**
	 * Lista todos os Palestrantes do banco que correspondem ao parametro em "where"
	 * @access public
	 * @name listWhere
	 * @since 25/04/2013 19:15:51
	 * @param string $where String de busca
	 * @return array Array de Palestrantes
	 */
	public function listWhere($where) {
		$where = ($where == "")? "" : "WHERE ".$where;
		$lista = array();
	
		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}` ".$where);
			$stmt->execute();
				
			while ($obj = $stmt->fetch(PDO::FETCH_OBJ, PDO::FETCH_ORI_NEXT)) {
	
				$palestrante = new Palestrante();
				$palestrante->setId($obj->id);
				$palestrante->setNome($obj->nome);
				$palestrante->setEmail($obj->email);
				$palestrante->setTelefone($obj->telefone);
				$palestrante->setCurriculum($obj->curriculum);
				$palestrante->setLinkLattes($obj->linkLattes);
				$palestrante->setFoto($obj->foto);
				$palestrante->setDataModificacao($obj->dataModificacao);
	
				$lista[] = $palestrante;
			}
				
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}
	
		return $lista;
	}
	
	
	/**
	* Remove um Palestrante do banco com base no id
	* @access public
	* @name delete
	* @param int $id Id do Palestrante a ser deletado
	* @since 25/04/2013 19:00:31
	*/
	public function delete($id) {
		try{
			$stmt = $this->db->prepare("DELETE FROM `{$this->entity}` WHERE id = ?");
			$stmt->bindValue(1, $id, PDO::PARAM_INT);
			$stmt->execute();
			
			SystemMessage::createMessage("Palestrante removido com sucesso!", SystemMessage::TYPE_SUCCESS);
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
				
	}

}


